﻿<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta charset="utf-8"/>
		<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
		<title>Стандартная библиотека. Основные модули</title>

		<link rel="stylesheet" type="text/css" href="http://moodle.spb.ru/file.php/84/python/standby.css"/><!-- page style: default -->
	</head>
	<body>
		<div class='page'>
			<h2>Стандартная библиотека. Основные модули</h2>
			<p>
				Как и многие другие языки, Python поставляется вместе с огромной библиотекой уже написанных классов и функций для работы в различных компьютерных областях. Тут вам пакеты для работы с почтой, web, xml и данными в различных форматах, архивацией; пакеты, позволяющие проводить тестирование; пакеты для работы с базами данных, сокетами (портами), различными протоколами. Всё и не перечислишь.
			</p>
			<p>
				<span class="important">Качественное знание не только синтаксиса, но и его библиотеки - доступных для использования классов, составляет общее понимание языка Python<span>. Конечно, достаточно выучить язык и можно писать собственные реализации тех или иных возможностей, но это, по крайней мере, глупо, поскольку в большинстве случаев всё написано до вас и, наверняка, лучше чем у Вас.
			</p>
			<p>
				В этом уроке мы рассмотрим лишь небольшую часть * модулей, входящих в стандартную поставку Python'а.
			</p>
			<div class="note">
				<p>
					Мы постарались отобрать только те модули, с которыми программист на языке Python работает чаще всего. Остальные модули должны изучаться в рамках решения соответствующих задач. Сейчас вам не нужно, например, знать, как можно скачать html-страницу из интернета и использовать регулярные выражения для её парсинга. Важно держать в уме то, что Python уже умеет это делать.
				</p>
				<p>
					Если вы хотите, можете посмотреть <a href="http://docs.python.org/py3k/modindex.html" title="Открыть раздел документации">полный список</a> встроенных в Python модулей на официальном сайте в разделе документации.
				</p>
			</div>
			<h3>Модуль sys</h3>
			<p>
				Модуль <cite><b>sys</b><cite> содержит информацию о среде выполнения программы и об интерпретаторе Python. Далее будут приведены некоторые объекты из этого модуля, которые, на наш взгляд, являются наиболее интересными.
			</p>
			<p>
				Как и другие модули, модуль sys можно подключить с помощью инструкции <cite>import</cite>:
				<code>
					<span style="color: #0000FF;">import</span><span style="color: #000000;"> sys</span>
				</code>
			</p>
			<p>
				Одним из объектов модуля <cite>sys</cite> является <cite><b>sys.path</b></cite> - список строк, которые содержат пути для поиска модулей интерпретатором:
				<code>
					<span style="color: #000000;">print(sys.path)</span><br/><span class="comment"># Будет выведено что-нибудь вроде этого (если система Linux):</span><br/><span class="comment"># ['', '/usr/lib/python3.2',<br/># '/usr/lib/python3.2/plat-linux2', '/usr/lib/python3.2/lib-dynload',<br/># '/usr/local/lib/python3.2/dist-packages', '/usr/lib/python3/dist-packages']
				</code>
			</p>
			<p>
				Переменные <cite><b>sys.version</b></cite> и <cite><b>sys.version_info</b></cite> содержат информацию о версии интерпретатора в виде строки или кортежа соответственно:
				<code>
					<span style="color: #000000;">print(sys.version)<br/>print(sys.version_info)</span><br/><span class="comment"># Примерный результат работы команд:<br/># 3.2 (r32:88445, Mar 25 2011, 19:28:28) [GCC 4.5.2]<br/># sys.version_info(major=3, minor=2, micro=0, releaselevel='final', serial=0)</span>
				</code>
			</p>
			<p>
				Получение версии Python'а для ее дальнейшего использования всегда производится из <cite>version_info</cite>, а не вырезается из строки <cite>version</cite>!
				<code>
					<span style="color: #000000;">pythonVersion = sys.version_info[0]<br/><br/><span style="color: #0000FF;">if</span> pythonVersion == 3:<br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">pass</span><br/><span style="color: #0000FF;">elif</span> pythonVersion == 2:<br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">pass</span>
				</code>
			</p>
			<p>
				Переменная <cite><b>sys.argv</b></cite>, как вы уже знаете, содержит список аргументов командной строки *:
				<code>
					<span class="comment"># Допустим, что наш модуль работает с файлами.<br/># Запускаем интерпретатор из командной строки,<br/># передав в него модуль и нужные файлы<br/># (разделитель между аргументами - пробел):<br/># pythal@pc:~$ python3.2 my.py file1.txt file2.txt file3.txt</span><br/><span style="color: #000000;">print(sys.argv)</span><br/><span class="comment"># Выведет на экран:<br/># ['my.py', 'file1.txt', 'file2.txt', 'file3.txt']</span>
				</code>
			</p>
			<p>
				Как видите, первый аргумент (с индексом 0) - это относительный путь к файлу нашего модуля. Далее идут все остальные аргументы.
			</p>
			<div class="note">
				<p>
					Возможно, вы знаете, что в языке C аргументы командной строки могла принимать только главная функция <cite>int main(int argc, char **argv) { ... }</cite>, где <cite>argc</cite> - количество аргументов (строк), а <cite>argv</cite> - массив указателей на эти строки. В Python нет никаких главных функций, поэтому данная информация хранится в специальном объекте.
				</p>
			</div>
			<p>
				Функция <cite><b>sys.exit([arg])</b></cite> служит для завершения программы. Она принимает один <u>необязательный</u> аргумент - код завершения программы. Уже давно в программировании устоялось то, что в качестве кода выступает целое число. 0 означает, что программа завершилась <u>успешно</u>, в остальных случаях, естественно, подразумевается, что произошла ошибка. Но Python в этом плане не накладывает никаких ограничений - аргумент может быть, в принципе, любого типа:
				<code>
					<span class="comment"># Есть модуль test.py следующего вида:</span><span style="color: #000000;"><br/><span style="color: #0000FF;">import</span> sys<br/>sys.exit('Error message')</span><br/><br/><span class="comment"># Запускаем его:<br/># pythal@pc:~$ python3.2 test.py<br/># В терминале или в консоли (в случае, если ОС - Windows)<br/># будет выведено: 'Error message'</span>
				</code>
			</p>
			<p>
				Функция <cite><b>sys.getsizeof(object)</b></cite> возвращает размер переданного ей объекта в байтах. Эта функция вызывает специальную функцию <cite>__sizeof__</cite> у объекта и возвращает ее результат.
				<code>
					<span style="color: #000000;">print(sys.getsizeof(<span style="color: #0000FF;">False</span>))</span><span class="comment"> # 12</span><br/><span style="color: #000000;">print(sys.getsizeof(2**10000000))</span><span class="comment"> # 1333346</span>
				</code>
			</p>
			<p>
				Такой большой размер связан с тем, что все встроенные типы данных представляют собой классы.
			</p>
			<p>
				Переменная <cite><b>sys.platform</b></cite> содержит строку, идентификатор платформы, на которой запускается программа. Хоть Python и является мультиплатформенным языком, программы написанные на нем могут использовать компоненты, которые таковыми не являются (хоть это и очень редко происходит):
				<code>
					<span style="color: #000000;">print(sys.platform)</span><span class="comment"> # linux2</span>
				</code>
			</p>
			<p>
				Объекты <cite><b>sys.int_info</b></cite> и <cite><b>sys.float_info</b></cite> содержат информацию о целых числах и числах с плавающей точкой на данной платформе:
				<code>
					<span style="color: #000000;">print(sys.int_info)</span><br/><span class="comment"># sys.int_info(bits_per_digit=15, sizeof_digit=2)</span><br/><br/><span style="color: #000000;">print(sys,float_info)</span><br/><span class="comment"># sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308,<br/># min=2.2250738585072014e-308, min_exp=-1021,<br/># min_10_exp=-307, dig=15, mant_dig=53,<br/># epsilon=2.220446049250313e-16, radix=2, rounds=1)</span>
				</code>
			</p>
			<p>
				Как видите, для <cite>float</cite> тут указано все, что должно интересовать программиста при работе с данным типом: максимальное, минимальное значения, точность и так далее.
			</p>
			<h3>Модуль random</h3>
			<p>
				Этот модуль позволяет генерировать <a href="http://ru.wikipedia.org/wiki/Псевдослучайные_числа" title="Посмотреть в ВИКИ">псевдослучайные числа</a> для некоторых различных распределений. Импорт данного модуля в коде будет выглядеть, например, так *:
				<code>
					<span style="color: #000000;"><span style="color: #0000FF;">import</span> random <span style="color: #0000FF;">as</span> rand</span>
				</code>
			</p>
			<div class="note">
				<p>
					Не забывайте, что после переименования модуля, мы должны использовать его <u>новое</u> имя.
				</p>
			</div>
			<p>
				Главной функцией данного модуля является функция <cite><b>random()</b></cite>, которая возвращает псевдослучайное число из полуоткрытого диапазона <cite>[0.0, 1.0)</cite>:
				<code>
					<span style="color: #000000;">rand.random()</span><span class="comment"> # Выведет случайное число с плавающей точкой</span>
				</code>
			</p>
			<p>
				Достаточно часто возникает необходимость выбрать случайный элемент из набора данных. И в модуле random есть функция, позволяющая делать это - <cite><b>choice(s)</b></cite>, где <cite>s</cite> - последовательность:
				<code>
					<span style="color: #000000;">n = [1, 2, 3, 4, 5]<br/>rand.choice(n)</span><span class="comment"> # Выведет 1, 2, 3, 4 либо 5 - только одно число</span>
				</code>
			</p>
			<p>
				Данный модуль позволяет размешивать (переставлять в случайном порядке) элементы <u>изменяемой</u> последовательности. Для этого служит функция <cite><b>shuffle(s)</b></cite>, где <cite>s</cite> - изменяемая последовательность:
				<code>
					<span style="color: #000000;">s = [1, 2, 3, 4, 5]<br/>rand.shuffle(s)<br/>s</span><span class="comment"> # Может вывести, например, [3, 4, 1, 5, 2]</span>
				</code>
			</p>
			<p>
				Существуют и другие функции в этом модуле. Например, можно указать диапазон для получения псевдослучайных чисел, а не использовать стандартный [0.0, 1.0). Об этих и других функциях вы можете узнать из <a href="http://docs.python.org/py3k/library/random.html#module-random" title="Посмотреть раздел документации по модулю">документации</a>.
			</p>
			<h3>Модуль os</h3>
			<p>
				Данный модуль предоставляет переносимый (между различными системами) способ использования функционала операционных систем. Разные операционные системы имеют различную архитектуру и способы взаимодействия с ними. Данный модуль позволяет не думать об этом - вы просто используется его функции, и на всех системах они работают.
			</p>
			<p>
				Наверное, наиболее полезной функцией в os является функция <cite><b>walk(top, topdown=True)</b></cite> - она совершает <u>рекурсивный</u> обход переданной ей директории <cite>top</cite>. Результат можно преобразовать в список всех путей.
				<code>
					<span class="comment"># Допустим, что у нас есть директория topDir такого вида:<br/># topDir /<br/># ------- topDoc<br/># ------- midDir /<br/># --------------- midDoc 1<br/># --------------- midDoc 2<br/># --------------- downDir /<br/># -------------------------downDoc<br/><br/># Передаем абсолютный путь нашей директории</span><br/><span style="color: #000000;">listDir = list(os.walk('/home/pythal/topDir'))<br/>print(listDir)</span><br/><span class="comment"># [('/home/pythal/topDir', ['midDir'], ['topDoc']),<br/># ('/home/pythal/topDir/midDir', ['downDir'], ['midDoc 1', 'midDoc 2']),<br/># ('/home/pythal/topDir/midDir/downDir', [], ['downDoc'])]</span>
				</code>
			</p>
			<p>
				Вывод немного не читаемый, но можно заметить, что это - список кортежей. Давайте выведем его в более читаемой форме:
				<code>
					<span style="color: #000000;"><span style="color: #0000FF;">for</span> i <span style="color: #0000FF;">in</span> listDir :<br/>&nbsp;&nbsp;&nbsp;&nbsp;print(i)</span><br/>
					<span class="comment"># ('/home/pythal/topDir', ['midDir'], ['topDoc'])<br/># ('/home/pythal/topDir/midDir', ['downDir'], ['midDoc 1', 'midDoc 2'])<br/># ('/home/pythal/topDir/midDir/downDir', [], ['downDoc'])</span>
				</code>
			</p>
			<p>
				Теперь нетрудно понять структуру вывода:
			</p>
			<p>
				<ul type="circle">
					<li>Нулевой элемент кортежа - это путь к директории</li>
					<li>Первый элемент - это список всех директорий, вложенных в данную</li>
					<li>Второй элемент - это список всех файлов в данной директории</li>
				</ul>
			</p>
			<p>
				Аргумент <cite>topdown</cite> функции <cite>walk</cite> (по-умолчанию <cite>True</cite>) определяет порядок обхода. topdown - сверху-вниз. То есть если <cite>topdown=True</cite>, то мы как бы говорим интерпретатору, что нам нужны все пути от верхней директории до самой вложенной, сверху-вниз. Если же <cite>topdown=False</cite>, то тогда возвращаемый порядок будет обратным, снизу-вверх:
				<code>
					<span style="color: #000000;"><span style="color: #0000FF;">for</span> i <span style="color: #0000FF;">in</span> list(os.walk('/home/pythal/topDir', topdown=<span style="color: #0000FF;">False</span>)) :<br/>&nbsp;&nbsp;&nbsp;&nbsp;print(i)</span><br/><br/><span class="comment"># ('/home/pythal/topDir/midDir/downDir', [], ['downDoc'])<br/># ('/home/pythal/topDir/midDir', ['downDir'], ['midDoc 1', 'midDoc 2'])<br/># ('/home/pythal/topDir', ['midDir'], ['topDoc'])</span>
				</code>
			</p>
			<p>
				Как видите, порядок поменялся на противоположный.
			</p>
			<h3>Модуль os.path</h3>
			<p>
				Модуль <cite><b>os.path</b></cite> позволяет одинаково работать с путями файлов (только путями, не файлами) <span class="important">вне зависимости от операционной системы</span>. Его необходимость весьма очевидна, ведь в каждой операционной системе существуют свои соглашения об организации доступа к файлам. Самый известный пример - это символ, являющийся разделителем между директориями и файлами. В операционной системе Windows это символ обратного слеша * <cite>\<cite>, в Unix - прямого <cite>/<cite>.
			</p>
			<div class="note">
				<p>
					Нужно всегда помнить, что <cite>\<cite> - это управляющий символ в строках, и в случае с Windows его необходимо экранировать, то есть писать <cite>\\</cite> - двойной обратный слеш. <b>Но</b> интерпретатор Python позволяет использовать Unix-стиль в любой системе, в том числе и в Windows.
				</p>
			</div>
			<p>
				Работу с путями можно и нужно осуществлять через модуль os.path, так как он берет на себя всю заботу по правильному формированию путей независимо от системы. Рассмотрим его основные функции:
			</p>
			<table width="640px" cellpadding="0" cellspacing="0">
				<tr class="lineA head">
					<td class="left">
						Функция
					</td>
					<td>
						Описание
					</td>
				</tr>
				<tr class="lineB">
					<td class="left">
						os.path.dirname(path)
					</td>
					<td>
						Возвращает имя директории для пути path:
						<code>
							<span style="color: #000000;">os.path.dirname('/home/pythal')</span><br/><span class="comment"> # '/home'</span><br/><span style="color: #000000;">os.path.dirname('/home/pythal/')</span><br/><span class="comment"> # '/home/pythal'</span><br/><span style="color: #000000;">os.path.dirname('/home/pythal/topDir')</span><br/><span class="comment"> # '/home/pythal'</span><br/><span style="color: #000000;">os.path.dirname('/home/pythal/topDir/')</span><br/><span class="comment"> # '/home/pythal/topDir'</span>
						</code>
						Как видите, разделитель существенно влияет на результат
					</td>
				</tr>
				<tr class="lineA">
					<td class="left">
						os.path.exists(path)
					</td>
					<td>
						Возвращает <cite>True</cite>, если <cite>path</cite> ссылается на существующий путь (в ОС), иначе - <cite>False</cite>.
						<code>
							<span style="color: #000000;">os.path.exists('/home/pythal/topDir')</span><span class="comment"> # True</span><br/><span style="color: #000000;">os.path.exists('/home/pythal/topDir/')</span><span class="comment"> # True</span><br/><span style="color: #000000;">os.path.exists('/home/pythal/topDir_2')</span><span class="comment"> # False</span><br/>
						</code>
					</td>
				</tr>
				<tr class="lineB">
					<td class="left">
						os.path.getsize(path)
					</td>
					<td>
						Возвращает размер в байтах для <cite>path</cite>. Если путь не существует, то тогда программа аварийно завершится с ошибкой:
						<code>
							<span style="color: #000000;">os.path.getsize('/home/pythal/p.py')</span><span class="comment"> # 608</span><br/><span style="color: #000000;">os.path.getsize('/home/pythal/1234')</span><br/><span class="error"> # OSError: нет такого файла или директории</span>
						</code>
					</td>
				</tr>
				<tr class="lineA">
					<td class="left">
						os.path.isfile(path)
					</td>
					<td>
						<cite>True</cite> - если path - это существующий файл, иначе - <cite>False</cite>.
						<code>
							<span style="color: #000000;">os.path.isfile('/home/pythal/p.py')</span><span class="comment"> # True</span><br/><span style="color: #000000;">os.path.isfile('/home/pythal/1234')</span><span class="comment"> # False</span>
						</code>
					</td>
				</tr>
				<tr class="lineB">
					<td class="left">
						os.path.isdir(path)
					</td>
					<td>
						<cite>True</cite> - если path - это существующая директория, иначе - <cite>False</cite>.
						<code>
							<span style="color: #000000;">os.path.isdir('/home/pythal/')</span><span class="comment"> # True</span><br/><span style="color: #000000;">os.path.isdir('/home/pythal/p.py')</span><span class="comment"> # False</span>
						</code>
					</td>
				</tr>
				<tr class="lineA">
					<td class="left">
						os.path.join(path1, [path2,...])
					</td>
					<td>
						Соединяет несколько путей в один. Чаще всего в качестве <cite>path1</cite> выступает <u>абсолютный</u> путь, а в качестве <cite>path2</cite>, <cite>path3</cite> ... - <u>относительные</u>.
						<code>
							<span style="color: #000000;">os.path.join('/home/pythal', 'topDir')</span><br/><span class="comment"> # '/home/pythal/topDir'</span>
						</code>
					</td>
				</tr>
			</table>
			<p>
				Рассмотрим более практичный пример: нам нужно вывести на экран * файл <cite>input.txt</cite>, который лежит в той же директории, что и исполняемый файл (<cite>.py</cite>). 
			</p>
			<div class="note">
				<p>
					Сейчас нам не важно, как именно можно открыть файл и вывести его на экран. Об этом будет рассказано в следующих уроках.
				</p>
			</div>
			<p>
				Как вы уже знаете, модуль <cite>sys</cite> позволяет узнать местоположение исполняемого файла - через объект <cite>argv</cite>. С помощью этого объекта мы получим нужный нам каталог, после чего без проблем сможем открыть файл <cite>input.txt</cite> и вывести его содержимое на экран:
				<code>
					<span style="color: #000000;"><span style="color: #0000FF;">import</span> sys<br/><span style="color: #0000FF;">import</span> os.path<br/><br/>modPath = sys.argv[0]<span class="comment"> # Мы получили абсолютный путь к нашему модулю</span><br/>dir = os.path.dirname(modPath)<span class="comment"> # Директория, где лежит модуль</span><br/>path = os.path.join(dir, ‘input.txt’)<span class="comment"> # Абсолютный путь к файлу input.txt</span><br/><span style="color: #0000FF;">with</span> open(path) <span style="color: #0000FF;">as</span> input :<br/>&nbsp;&nbsp;&nbsp;&nbsp;print(input.read())</span>
				</code>
			</p>
			<h3>Модуль time</h3>
			<p>
				Понятно из названия, что данный модуль содержит ряд функций для работы с датой и временем. С этим модулем связаны ещё два модуля - <cite>datetime</cite> и <cite>calendar</cite>.
			</p>
			<p>
				Мы рассмотрим лишь некоторые функции для получения текущей даты и времени. Для этого нам нужно понять то, что, во-первых, <span class="important">функции модуля <cite>time</cite> в Python соответствуют стандартам POSIX и ISO C</span>. В заголовочных файлах языка С вы можете найти функции с точно такими же именами и принципом работы. Во-вторых, нужно знать, что существует некая дата, называемая <cite>epoch</cite> - точка отсчёта времени. Для систем Windows и Unix эта дата - 1-е января 1970-го года.
			</p>
			<p>
				Чтобы получить количество секунд, прошедших с <cite>epoch</cite> (1-го января 1970), нужно вызвать специальную функцию <cite><b>time()</b></cite>:
				<code>
					<span style="color: #000000;"><span style="color: #0000FF;">import</span> time<br/><br/>t = time.time()<br/>t</span><span class="comment"> # Выведет число с плавающей точкой</span>
				</code>
			</p>
			<p>
				Количество секунд получено, но как узнать, например, текущий год, день, месяц? Для этого существуют дополнительные функции модуля. Они позволяют преобразовывать данное число в понятные наборы данных.
			</p>
			<p>
				Одной из таких функций является <cite><b>ctime(s)</b></cite>. Она преобразует количество секунд, которые мы узнали, например, с помощь функции <cite>time()</cite>, в строку, в понятной форме отображающую локальное время. Если s не указать, что функция автоматически получит это значение для текущей даты и времени:
				<code>
					<span style="color: #000000;">time.ctime(t)</span><br/><span class="comment"># 'Wed May 15 14:33:22 1975'</span>
				</code>
			</p>
			<p>
				Вместо <cite>ctime()</cite> для преобразования можно воспользоваться другой функцией, которая называется <cite><b>localtime(s)</b></cite>, и работает она схожим образом. Отличие заключается в том, что эта функция возвращает объект класса <cite>struct_time</cite>:
				<code>
					<span style="color: #000000;">t = time.localtime()</span>
				</code>
			</p>
			<p>
				Объект <cite>t</cite> теперь имеет несколько полей-атрибутов, содержащих такие значение, как год, день месяца, день недели (0 - понедельник), день в году, часы, минуты, секунды и так далее.
			</p>
			<p>
				Все эти атрибуты содержит объект, связанный с именем <cite>t</cite>, и они начинаются с префикса <cite>tm_</cite>:
				<code>
					<span style="color: #000000;">t.tm_year</span><span class="comment"> # 2011</span><br/><span style="color: #000000;">t.tm_hour</span><span class="comment"> # 15
				</code>
			</p>
			<p>
				Ниже в таблице приведён полный список атрибутов класса <cite>struct_time</cite>:
			</p>
			<table width="640px" cellpadding="0" cellspacing="0">
				<tr class="lineA head">
					<td class="left">
						Атрибут
					</td>
					<td>
						Описание
					</td>
				</tr>
				<tr class="lineB">
					<td class="left">
						tm_year
					</td>
					<td>
						Год
					</td>
				</tr>
				<tr class="lineA">
					<td class="left">
						tm_mon
					</td>
					<td>
						Месяц - число от 1 до 12
					</td>
				</tr>
				<tr class="lineB">
					<td class="left">
						tm_mday
					</td>
					<td>
						День в месяце - от 1 до 31
					</td>
				</tr>
				<tr class="lineA">
					<td class="left">
						tm_hour
					</td>
					<td>
						Час - от 0 до 23
					</td>
				</tr>
				<tr class="lineB">
					<td class="left">
						tm_min
					</td>
					<td>
						Минуты - от 0 до 59
					</td>
				</tr>
				<tr class="lineA">
					<td class="left">
						tm_sec
					</td>
					<td>
						Секунды - от 0 до 61 (из исторических соображений)
					</td>
				</tr>
				<tr class="lineB">
					<td class="left">
						tm_wday
					</td>
					<td>
						День на неделе - от 0 (понедельник) до 6
					</td>
				</tr>
				<tr class="lineA">
					<td class="left">
						tm_yday
					</td>
					<td>
						День в году - от 0 до 366
					</td>
				</tr>
			</table>
			<h3>Модулю math</h3>
			<p>
				Модуль <cite><b>math</b></cite> предоставляет программисту большой набор математических функций, которые определены в стандарте языка C. Это означает, что все те функции, которыми вы, возможно, пользовались при разработке программ на языке C, реализованы в этом модуле.
			</p>
			<p>
				Стоит отметить, что <span class="important">данные функции не предназначены для использования совместно с комплексными числами</span> (оно и понятно - в языке C такого типа не было вообще). Для них существует специальный модуль <cite>cmath</cite> (от <i>complex math</i>), содержащий одноименные функции.
			</p>
			<p>
				Так же стоит учитывать, что все функции из модуля <cite>math</cite> возвращают значение типа <cite>float</cite> в качестве результата. Ниже приведён список наиболее востребованных математических функций и констант из этого модуля. С остальным функционалом вы можете ознакомится в соответствующем разделе <a href="http://docs.python.org/py3k/library/math.html#module-math" title="Посмотреть раздел документации по модулю">документации</a>.
			</p>
			<table width="640px" cellpadding="0" cellspacing="0">
				<tr class="lineA head">
					<td class="left">
						Функция/Значение
					</td>
					<td>
						Описание
					</td>
				</tr>
				<tr class="lineB">
					<td class="left">
						math.pi
					</td>
					<td>
						Значение числа &pi;
					</td>
				</tr>
				<tr class="lineA">
					<td class="left">
						math.e
					</td>
					<td>
						Значение экспоненты
					</td>
				</tr>
				<tr class="lineB">
					<td class="left">
						math.copysign(x, y)
					</td>
					<td>
						Вернёт число <cite>x</cite> со знаком <cite>y</cite>. Если платформа поддерживает отрицательный <cite>0 (-0)</cite>, можно использовать эту функцию так:
						<code>
							<span style="color: #000000;">math.copysign(5.2, -0.0)</span><span class="comment"> # -5.2</span>
						</code>
					</td>
				</tr>
				<tr class="lineA">
					<td class="left">
						math.fabs(x)
					</td>
					<td>
						Возвращает абсолютное значение <cite>x</cite> (модуль числа):
						<code>
							<span style="color: #000000;">math.fabs(-0.25)</span><span class="comment"> # 0.25</span>
						</code>
					</td>
				</tr>
				<tr class="lineB">
					<td class="left">
						math.factorial(x)
					</td>
					<td>
						Вычисляет факториал числа. Если число <cite>x</cite> не целое или отрицательное, интерпретатор выведет ошибку:
						<code>
							<span style="color: #000000;">math.factorial(5)</span><span class="comment"> # 120</span><br/><span style="color: #000000;">math.factorial(2.5)</span><span class="error"> # Ошибка</span>
						</code>
					</td>
				</tr>
				<tr class="lineA">
					<td class="left">
						math.trunc(x)
					</td>
					<td>
						Возвращает целую часть числа <cite>x</cite>. В данном случае дробная часть просто отсекается:
						<code>
							<span style="color: #000000;">math.trunc(6.9)</span><span class="comment"> # 6</span>
						</code>
					</td>
				</tr>
				<tr class="lineB">
					<td class="left">
						math.log(x, base)
					</td>
					<td>
						Возвращает значение логарифма <cite>x</cite> по основанию <cite>base</cite>. Второй аргумент передавать не обязательно - в этом случае значением по-умолчанию будет экспонента (в этом случае будет вычислен натуральный логарифм):
						<code>
							<span style="color: #000000;">math.log(100) == math.log(100, math.e)</span><span class="comment"> # True</span>
						</code>
					</td>
				</tr>
				<tr class="lineA">
					<td class="left">
						math.sqrt(x)
					</td>
					<td>
						Вычисляет квадратный корень числа <cite>x</cite>
					</td>
				</tr>
				<tr class="lineB">
					<td class="left">
						math.sin(x)<br/>math.cos(x)<br/>math.tan(x)
					</td>
					<td>
						Набор тригонометрических функций
					</td>
				</tr>
				<tr class="lineA">
					<td class="left">
						math.degrees(x)
					</td>
					<td>
						Перевод из радиан (<cite>x</cite>) в градусы:
						<code>
							<span style="color: #000000;">math.degrees(math.pi)</span><span class="comment"> # 180.0</span>
						</code>
					</td>
				</tr>
				<tr class="lineB">
					<td class="left">
						math.radians(x)
					</td>
					<td>
						Перевод из градусов (<cite>x</cite>) в радианы
					</td>
				</tr>
			</table>
			<hr/>
			<p>
				Мы рассмотрели всего несколько модулей, хотя в библиотеке их количество измеряется десятками. Помимо всего прочего, существуют модули сторонних разработчиков, которые дополняют или улучшают текущий функционал библиотеки.
			</p>
		</div>
		<div class="footer"></div>
	</body>
</html>